package com.ruoyi.web.controller.system;

import java.util.Date;
import java.util.List;
import java.util.Set;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.system.service.ISysMenuService;

/**
 * 登录验证
 * 
 * @author ruoyi
 */
@RestController
public class SysLoginController
{
    @Autowired
    private SysLoginService loginService;

    @Autowired
    private ISysMenuService menuService;

    @Autowired
    private SysPermissionService permissionService;
    @Autowired
    private ISysUserService sysUserService;
    @Autowired
    private ISysConfigService sysConfigService;
    /**
     * 登录方法
     * 
     * @param loginBody 登录信息
     * @return 结果
     */
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                loginBody.getUuid());
        ajax.put(Constants.TOKEN, token);
        return ajax;
    }

    /**
     * 登录方法app
     *
     * @param loginBody 登录信息
     * @return 结果
     */
    @PostMapping("/app/login")
    public AjaxResult appLogin(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword());
        ajax.put(Constants.TOKEN, token);
        //判断是否需要更新密码
        int isChangePassword = 1;
        if (!"admin".equals(loginBody.getUsername())) {
            isChangePassword = getIsChangePassword(loginBody, isChangePassword);
        }
        ajax.put(Constants.IS_CHANGE_PASSWORD, isChangePassword);
        // 返回用户信息
        SysUser sysUser = sysUserService.selectUserByUserName(loginBody.getUsername());
        sysUser.setPassword(null);
        ajax.put("userInfo", sysUser);
        return ajax;
    }
    /**
     *判断是否需要更改密码
     * @param loginBody
     * @param isChangePassword
     * @return 1：不需要  0：需要
     */
    private int getIsChangePassword(LoginBody loginBody, int isChangePassword) {
        Date passUpdateTime = null;
        Long passwordLimitLong;
        try{
            String passwordLimit = sysConfigService.selectConfigByKey("sys.passwordLimit");
            if("-1".equals(passwordLimit)){
                return 1;
            }
            passwordLimitLong = Long.parseLong(passwordLimit);
        }catch (Exception e){
            //todo
            passwordLimitLong = 90l;
        }
        SysUser user = sysUserService.selectUserByUserName(loginBody.getUsername());
        if (StringUtils.isNotNull(user)) {
            passUpdateTime = user.getPassUpdateTime();
        }
        if (StringUtils.isNotNull(passUpdateTime) ) {
            long spanDays = DateUtils.differentDayByTime(DateUtils.getNowDate(), passUpdateTime);
            if (spanDays > passwordLimitLong) {
                isChangePassword = 0;
            }
        }
        //用户不为空 && 密码更新时间为空时   进行更新passUpateTime
        if(StringUtils.isNotNull(user)
                && StringUtils.isNotNull(user.getUserId())
                && StringUtils.isNull(passUpdateTime)){
            sysUserService.updatePUTimeUser(user.getUserId());
        }
        return isChangePassword;
    }

    /**
     * 获取用户信息
     * 
     * @return 用户信息
     */
    @GetMapping("getInfo")
    public AjaxResult getInfo()
    {
        SysUser user = SecurityUtils.getLoginUser().getUser();
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // 权限集合
        Set<String> permissions = permissionService.getMenuPermission(user);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        return ajax;
    }

    /**
     * 获取路由信息
     * 
     * @return 路由信息
     */
    @GetMapping("getRouters")
    public AjaxResult getRouters()
    {
        Long userId = SecurityUtils.getUserId();
        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
        return AjaxResult.success(menuService.buildMenus(menus));
    }
}
